package org.grc.app.z_project.z_framework.helper;

import java.lang.reflect.Field;
import java.util.Map;

import org.grc.app.z_project.z_framework.annotation.Inject;
import org.grc.app.z_project.z_framework.util.ArrayUtil;
import org.grc.app.z_project.z_framework.util.ReflectionUtil;

/**
 * 依赖注入助手类
 * 
 * @author grc
 * @since 1.0-SNAPSHOT
 */
public final class IocHelper {

	// Bean Map
	private static Map<Class<?>, Object> beanMap = null;
	
	static {
		// 获取所有的 Bean 类和 Bean 实例之间的映射关系（简称 Bean Map）
		beanMap = BeanHelper.getBeanMap();
		// 遍历 Bean Map
		for (Map.Entry<Class<?>, Object> beanEntry : beanMap.entrySet()) {
			// 从 Bean Map中获取 Bean类和 Bean实例
			Class<?> beanClass = beanEntry.getKey();
			Object beanInstance = beanEntry.getValue();
			// 获取 Bean类定义的所有成员变量（简称 Bean Field）
			Field[] beanFields = beanClass.getDeclaredFields();
			if (ArrayUtil.isNotEmpty(beanFields)) {
				// 遍历 Bean Field
				for (Field beanField : beanFields) {
					// 判断当前 Bean Field 是否有 Inject 注解
					if (beanField.isAnnotationPresent(Inject.class)) {
						// 在 Bean Map 中获取 Bean Field 对应的实例
						Class<?> beanFieldClass = beanField.getType();
						// 实现了接口注入功能
						Object beanFieldInstance = getBeanFromBeanMap(beanFieldClass);
						if (beanFieldInstance != null) {
							// 通过反射初始化 Bean Field 的值
							ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance);
						}
					}
				}
			}
		}
	}
	
	/**
	 * 从 Bean Map中获取 Bean（如果是接口，可以找到对应的实现类 Bean）
	 */
	private static Object getBeanFromBeanMap (Class<?> beanClass) {
		Object result = null;
		// 判断 Bean Class 是否为接口
		if (beanClass.isInterface()) {
			result = beanMap.get(ClassHelper.getImplClassByInterfaceClass(beanClass));
		} else {
			result = beanMap.get(beanClass);
		}
		return result;
	}
}
